//1引入vue:使用插件Vue.use
import Vue from 'vue';
//2引入vuex插件:插件对象----install
import vuex from 'vuex';
//3使用插件
Vue.use(vuex);
//4:对外暴露仓库
export default  new vuex.Store({
      //vuex开启严格模式：严格模式只有mutations可以修改仓库数据
      strict:true,
      //配置对象
      //存储数据的对象---仓库的
      state:{
        count:1,
        students:[
           {name:"小强",age:88,sex:"男"},
           {name:"小晶",age:99,sex:'男'},
           {name:"老刘",age:19,sex:'男'},
           {name:"小秋",age:16,sex:'女'},
           {name:"小宇",age:28,sex:"女"}
        ]
      }
      ,
      //唯一修改state数据地方
      mutations:{
        //ADDONE类型的mutation
        //唯一可以修改仓库中数据的地方
        ADDONE:(state)=>{
            state.count++;
        },
        MINUSONE:(state)=>{
           state.count--;
        }
        ,
        RANDOMONE(state,payload){
          state.count+=payload;
        }
        ,
        //间接实现v-model修改仓库数据
        MODEL(state,payload){
          state.count = payload;
        }
      },
      //这里可以书写修改数据业务、逻辑、异步语句等等
      actions:{
         //addOne类型的的action
         //当action【右侧函数执行的时候，vuex会给你注入实参,可以用形参接受】
         //注入context【上下文对象:commit方法、dispatch方法、state】
         addOne:({commit,state,dispatch})=>{
              //这里不能直接修改仓库数据:书写业务逻辑、书写异步语句、但是不能直接修改数据！！！
              //提交mutation---修改
              //第一个参数:mutation名字,mutation英文字母务必全都大写
              commit("ADDONE");
         }
         ,
         //minusOne类型的action
         minusOne:({commit,state,dispatch})=>{
               //提交mutations修改仓库的数据
               commit("MINUSONE")
         },
         //evenOne类型action  
         evenOne:({commit,state,dispatch})=>{
              //如果仓库数据是偶数：数据加1
              if(state.count % 2 ==0){
                commit("ADDONE")
              }
         },
         //oddOne类型的action
         oddOne:({commit,state,dispatch})=>{
              if(state.count%2!=0){
                commit("MINUSONE")
              }
         },
         //randomOne类型的action
         //第一个参数：一定是vuex注入的上下文  第二个参数:dispatch的第二个参数
         randomOne:({commit,state,dispatch},payload)=>{
             commit("RANDOMONE",payload)
         },
         delayOne:({commit,state,dispatch})=>{
               //逻辑：异步语句
               //异步语句：定时器、延迟器、ajax、Promise
               setTimeout(()=>{
                commit("ADDONE");
               },1000);
         },
         model({commit,state,dispatch},payload){
            commit('MODEL',payload);
         }
      },
      //核心概念之一:计算属性【仓库数据的计算属性】
      getters:{
         girl(state){
           //不要书写this.xxxx,没有this
             return state.students.filter(item=>item.sex=='女')
         }
      }
})

